from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager,Shell
from flask_migrate import Migrate, MigrateCommand
from app import db,create_app
from app.models import *
import os


app = create_app(os.getenv('FLASK_CONFIG') or 'default')
# DIALECT = 'mysql'
# DRIVER = 'pymysql'
# USERNAME = 'root'
# PASSWORD = '123456'
# HOST = '127.0.0.1'
# PORT = '3306'
# DATABASE = 'flask'
# SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
#                                                                        DATABASE)

# app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
# app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
 
def make_shell_context():
    return dict(db=db, User=User, Role=Role)

# 初始化 migrate
# 两个参数一个是 Flask 的 app，一个是数据库 db
migrate = Migrate(app, db)

# 初始化管理器
manager = Manager(app)
# 添加 db 命令，并与 MigrateCommand 绑定
manager.add_command('db', MigrateCommand)
manager.add_command("shell",Shell(make_context=make_shell_context))


# 构建我们的数据模型 

@manager.command
def create_db():
    db.create_all()

if __name__ == '__main__':
    manager.run()

# $ python manage.py db init
# $ python manage.py db migrate
# $ python manage.py db upgrade
# $ python manage.py db --help

'''
python .\manage.py shell   执行shell 操作

如果migrate出现了失败，很可能是因为migration文件包含的变更信息由于当前数据库的约束无法完完成。

总结如下：

介绍：
一、因为采用db.create_all在后期修改字段的时候，不会自动的映射到数据库中，必须删除表，然后重新运行db.craete_all才会重新映射，这样不符合我们的需求。因此flask-migrate就是为了解决这个问题，它可以在每次修改模型后，可以将修改的东西映射到数据库中。
二、使用flask_migrate必须借助flask_scripts，这个包的MigrateCommand中包含了所有和数据库相关的命令。
三、flask_migrate相关的命令：
    1. python manage.py db init：初始化一个迁移脚本的环境，只需要执行一次。
    2. python manage.py db migrate：将模型生成迁移文件，只要模型更改了，就需要执行一遍这个命令。
    3. python manage.py db upgrade：将迁移文件真正的映射到数据库中。每次运行了migrate命令后，就记得要运行这个命令。
四、注意点：需要将你想要映射到数据库中的模型，都要导入到manage.py文件中，如果没有导入进去，就不会映射到数据库中。

作者：凌烟醉卧
链接：https://www.jianshu.com/p/e4fc86fa21e8
来源：简书
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
'''